function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, height) {
    // 计算
    let midRatio = (startRatio + endRatio) / 2;

    let startRadian = startRatio * Math.PI * 2;
    let endRadian = endRatio * Math.PI * 2;
    let midRadian = midRatio * Math.PI * 2;

    // 如果只有一个扇形，则不实现选中效果。
    if (startRatio === 0 && endRatio === 1) {
        isSelected = false;
    }

    // 通过扇形内径/外径的值，换算出辅助参数 k（默认值 1/3）
    k = typeof k !== 'undefined' ? k : 1 / 3;

    // 计算选中效果分别在 x 轴、y 轴方向上的位移（未选中，则位移均为 0）
    let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
    let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;

    // 计算高亮效果的放大比例（未高亮，则比例为 1）
    let hoverRate = isHovered ? 1.2 : 1.2;

    // 返回曲面参数方程
    return {
        u: {
            min: -Math.PI,
            max: Math.PI * 3,
            step: Math.PI / 32
        },
        v: {
            min: 0,
            max: Math.PI * 2,
            step: Math.PI / 20
        },
        x: function (u, v) {
            if (u < startRadian) {
                return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
            }
            if (u > endRadian) {
                return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
            }
            return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
        },
        y: function (u, v) {
            if (u < startRadian) {
                return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
            }
            if (u > endRadian) {
                return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
            }
            return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
        },
        z: function (u, v) {
            if (u < - Math.PI * 0.5) {
                return Math.sin(u);
            }
            if (u > Math.PI * 2.5) {
                return Math.sin(u);
            }
            return Math.sin(v) > 0 ? 0.8 * height : -1;
        }
    };
}

function getPie3D(pieData, internalDiameterRatio) {
    let series = [];
    let sumValue = 0;
    let startValue = 0;
    let endValue = 0;
    let legendData = [];
    let k = 1 / 5;

    for (let i = 0; i < pieData.length; i++) {
        sumValue += pieData[i].value;

        let seriesItem = {
            name: typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,
            type: 'surface',
            parametric: true,
            wireframe: {
                show: false
            },
            pieData: pieData[i],
            pieStatus: {
                selected: false,
                hovered: false,
                k: k
            }
        };

        if (typeof pieData[i].itemStyle != 'undefined') {
            let itemStyle = {};
            typeof pieData[i].itemStyle.color != 'undefined' ? itemStyle.color = pieData[i].itemStyle.color : null;
            typeof pieData[i].itemStyle.opacity != 'undefined' ? itemStyle.opacity = 1 : 1;
            seriesItem.itemStyle = itemStyle;
        }
        series.push(seriesItem);
    }
    
    let maxValue = Math.max(...series.map(item => item.pieData.value));
    const MAX_HEIGHT = 200; // 此处调整最大高度
    
    for (let i = 0; i < series.length; i++) { 
        endValue = startValue + series[i].pieData.value;
        series[i].pieData.startRatio = startValue / sumValue;
        series[i].pieData.endRatio = endValue / sumValue;
        const heightRatio = (series[i].pieData.value / maxValue) * MAX_HEIGHT;
        series[i].parametricEquation = getParametricEquation(
            series[i].pieData.startRatio, 
            series[i].pieData.endRatio, 
            false, 
            false, 
            k, 
            heightRatio
        );
        startValue = endValue;
        legendData.push(series[i].name);
    }

    series.push({
        name: 'mouseoutSeries',
        type: 'surface',
        parametric: true,
        wireframe: { show: false },
        itemStyle: {
            opacity: 0.6,
            color: function (params) {
                const xValue = params.data[0];
                const yValue = params.data[1];
                const zValue = params.data[2];
                const alpha = Math.max(0, 1 - Math.sqrt(xValue * xValue + yValue * yValue + zValue * zValue) / 5);
                return `rgba(44, 120, 157, ${alpha})`;
            },
        },
        parametricEquation: {
            u: { min: 0, max: Math.PI * 2, step: Math.PI / 40 },
            v: { min: 0, max: Math.PI * 2, step: Math.PI / 40 },
            x: function (u, v) { return ((Math.sin(v) * Math.sin(u) + Math.sin(u)) / Math.PI) * 2.5; },
            y: function (u, v) { return ((Math.sin(v) * Math.cos(u) + Math.cos(u)) / Math.PI) * 2.5; },
            z: function (u, v) { return Math.cos(v) > 0 ? -0.5 : -20; },
        },
    });

    series.push({
        name: 'mouseoutSeries',
        type: 'surface',
        parametric: true,
        wireframe: { show: false },
        itemStyle: {
            opacity: 0.1,
            color: '#99e5f7',
        },
        parametricEquation: {
            u: { min: 0, max: Math.PI * 2, step: Math.PI / 20 },
            v: { min: 0, max: Math.PI * 2, step: Math.PI / 20 },
            x: function (u, v) { return ((Math.sin(v) * Math.sin(u) + Math.sin(u)) / Math.PI) * 2.9; },
            y: function (u, v) { return ((Math.sin(v) * Math.cos(u) + Math.cos(u)) / Math.PI) * 2.9; },
            z: function (u, v) { return Math.cos(v) > 0 ? -16 : -20; },
        },
    });

    return series;
}

export function createChartOption(optionsData) {
    const series = getPie3D(optionsData, 0.8);

    series.push({
        name: 'pie2d',
        type: 'pie',
        label: {
            show: false
        },
        labelLine: {
            show: false
        },
        startAngle: -50,
        clockwise: false,
        radius: ['15%', '70%'],
        center: ['50%', '50%'],
        data: optionsData,
        itemStyle: {
            opacity: 0,
        },
    });

    return {
        legend: {
            show: false // 图例移到组件外部显示，不在图表内显示
        },
        animation: true,
        tooltip: {
            trigger: 'item',
            backgroundColor: 'rgb(189, 219, 241,0.8)',
            formatter: params => {
                if (params.seriesName !== 'mouseoutSeries' && params.seriesName !== 'pie2d') {
                    const index = params.seriesIndex !== undefined ? params.seriesIndex : params.dataIndex;
                    if (index >= 0 && index < optionsData.length) {
                        return `<span style='color:#23457f'>${optionsData[index].name}<br/>捕捞量：${optionsData[index].value.toLocaleString()} 吨</span>`;
                    }
                }
                return '';
            },
            textStyle: { fontSize: 12 },
        },
        title: {
            show: false
        },
        backgroundColor: 'rgba(0, 0, 0,0)',
        labelLine: { show: false },
        label: {
            show: false
        },
        xAxis3D: { min: -1, max: 1 },
        yAxis3D: { min: -1, max: 1 },
        zAxis3D: { min: -1, max: 1 },
        grid3D: {
            show: false,
            boxHeight: 0.5,
            left: '5%',
            right: '5%',
            top: '2%',
            bottom: '2%',
            viewControl: {
                distance: 160,
                alpha: 25,
                beta: 60,
                autoRotate: false,
                rotateSensitivity: 0,
                zoomSensitivity: 0,
                panSensitivity: 0
            },
        },
        series: series,
    };
}

